package com.example.myanimator.drawpictrue;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

/**
 * @author tgw
 * @date 2021/3/29
 * @describe 贝济埃 曲线
 */
public class DrawBeiJiaiPath extends View {

    private Paint mPaint;
    private Path mPath;
    private Canvas mCanvas;
    private int mitemWaveLength = 200;
    private float mCurAnimValue;

    public DrawBeiJiaiPath(Context context) {
        super(context);
    }

    public DrawBeiJiaiPath(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true); // 去除锯齿
        mPaint.setDither(true); // 抗抖动
        mPaint.setStrokeWidth(2);//设置笔画宽度
        mPaint.setStyle(Paint.Style.STROKE);
//        mPaint.setTextAlign(Paint.Align.CENTER);//设置文字对齐方式
        mPaint.setTextSize(100);//设置文字大小
        //
        mPaint.setFakeBoldText(true);//是否为粗体
//        mPaint.setUnderlineText(true);//设置下划线
        mPaint.setTextSkewX((float) -0.25);//设置字体水平倾斜度，普通斜体字设为-0.25
//        mPaint.setStrikeThruText(true);//设置带有删除线效果
        mPaint.setTextScaleX(2);//水平方向字体拉伸，高度不变
        mPaint.setColor(Color.BLACK);
        mPaint.setSubpixelText(true);//打开亚像素绘制文本--会增强文本清晰度，但会牺牲计算器性能
        mPath = new Path();
        mCanvas = new Canvas();

        //波浪动画
        startWaveAnimator();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        /**
         * //二阶贝济埃曲线
         public void quadTo ( float xl, float yl, float x2, float y2)
         public void rQuadTo ( float dxl, float dyl, float dx2, float dy2)
         //三阶贝济埃曲线
         public vo cubicTo ( float xl, float yl, float x2, float y2, float x3, float y3)
         public vo rCubicTo ( float xl, float yl, float x2, float y2, float x3, float y3 )
         */

        /**  quadTo x1 y1 贝济埃的控制点 ，x2,y2 ,目标点*/
        mPath.moveTo(100, getHeight() / 2);
        mPath.quadTo(200, 0, 300, getHeight() / 2);
        mPath.quadTo(400, getHeight(), 500, getHeight() / 2);
        canvas.drawPath(mPath, mPaint);

        /**
         * rQuadTo（）函 数的声明如下
         * publ void rQuadTo(float dxl , float dyl, float dx2, float dy2)
         * 参数
         * • dxl 控制点 坐标，表示相对上 个终点 坐标的位移坐标 可为负值，正值表示相
         * 加，负值表示相减。
         * • dyl ：控制 坐标，表示相对上 个终点 坐标的位移坐标。同样可为负值，正值表
         * 示相加，负值表示相减
         * • dx2 终点 坐标，同样是 个相对坐标，表示相对上 终点 标的位移值。可为
         * 负值，正值表示相加，负值表示相减。
         * • dy2 终点 坐标，同样是 个相对坐标，表示相对上 个终点 坐标的位移值 可为
         * 负值，正值表示相加 负值表示相减。
         *
         * 这四个参数传递的都是相对值，即相对上一个终点的位移值
         * 比如，上一个终点坐标是（300,400），那么利用 rQuadTo( 100， -100,200,100）； 得到的控制点坐
         * 标是（ 100+100,400-100 ，即（500 ,300）； 同样，得到的终点坐标是 （300+200,400+100），即(500,500）
         * */
        mPath.reset();
        canvas.save();
        canvas.translate(100, 0);
        mPath.moveTo(100, getHeight() / 2);
//        mPaint.setColor(Color.YELLOW);
        mPath.rQuadTo(100, -getHeight() / 2, 200, 0);
        mPath.rQuadTo(100, getHeight() / 2, 200, 0);
        canvas.drawPath(mPath, mPaint);


        // 波浪动画
//        mPath.reset();
//        canvas.restore();
//        mPaint.setColor(Color.RED);
        int originY = 300;
        int halfWaveLen = mitemWaveLength / 2;
        mPath.moveTo(mitemWaveLength+mCurAnimValue, originY);
        for (int i = -mitemWaveLength; i <= getWidth() + mitemWaveLength; i += mitemWaveLength) {
            mPath.rQuadTo(halfWaveLen / 2, -100, mitemWaveLength, 0);
            mPath.rQuadTo(halfWaveLen / 2, 100, mitemWaveLength, 0);
        }
        mPath.lineTo(getWidth() ,getHeight());
        mPath.lineTo(0,getHeight()) ;
        mPath.close() ;
        canvas.drawPath(mPath, mPaint);


    }

    private void startWaveAnimator() {
        ValueAnimator animator = ValueAnimator.ofFloat(0, mitemWaveLength);
//        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mCurAnimValue = (float) animation.getAnimatedValue();
                invalidate();
            }
        });
        animator.setDuration(3000);
        animator.start();
    }
}
